#ifndef XMLDOCUMENT_H
#define XMLDOCUMENT_H

#include "XML_global.h"

#include "Element.h"
#include "Node.h"
#include "TextNode.h"

#include <string>
#include <sstream>
#include <fstream>

using namespace std;

namespace xml{

    /*! @brief La classe XMLDocument sert à lire et écrire un document XML  */
    class XMLSHARED_EXPORT Document :  Node
    {
        public:

        /*******************************************
         *              Public
         *******************************************/

            /*******************************************
             *              Constructors
             *******************************************/

                Document();
                Document(ifstream * file);
                Document(string filepath);

            /*******************************************
             *              Methods
             *******************************************/



                /*! @brief Retourne une liste d'élément XML corespondant au tagname passé en paramètre*/
                vector<Element *>   GetElementsByTagName(string tagName);


                bool LoadXML(string filePath);

                /*! @brief Save the XML document inside a file. Mode is used to define the behaviour of the
                 *  save method in case a file with the same name would already exist.
                 *  0 mean it won't erase an already existing file, where 1 will erase it
                 */
                bool Save(const char * filePath, int mode);

                void Save(ofstream * f);

                /*!< @brief Cette méthode va parcourir le document, et afficher le contenu de chaque
                 *      noeud dans la console   */
                void Print();


            /*******************************************
             *              Properties
             *******************************************/

                /*! @brief Propriété utilisé pour déterminer si le document à été correctement chargé */
                bool    Error;

                /*! @brief Write the defn */
                void WriteDefinition(ofstream * f);

        /*******************************************
         *              Private
         *******************************************/

            /*******************************************
             *              Methods
             *******************************************/

                bool        LoadFile(ifstream *f);
                void        LoadElement();
                void        LoadAttributes();
                void        LoadAttribute();
                void        LoadContent();

                void        SkipFirstLine(ifstream * file);
                void        LoadRootElement(ifstream * file);

                Element *   LoadTag(ifstream *f);

            /*******************************************
             *              Properties
             *******************************************/

                Element *    m_Root;
    };
}

#endif // XMLDOCUMENT_H
